use serde::Deserialize;
use std::fs;

/*
    从config文件里面读取配置
        主要包括：
            1. 网关基础信息
            2. modubus从站信息(网关作为主战， 从从站接受消息，目前基于tokio & epoll实现，后续考虑io_uring)
*/

//  网关配置
#[derive(Debug, Deserialize, Clone)]
pub struct GetawayCfg {
    pub id: String,
    pub poll_interval_ms: u64, // 轮询时间
}

//  modbus从站配置
#[derive(Debug, Deserialize, Clone)]
pub struct ModbusSlave {
    pub name: String,
    pub addr: String,
    pub start_reg: u16,
    pub reg_count: u16,
    pub unit_id: u8 // RTU支持
}

//  modbus 配置
#[derive(Debug, Deserialize, Clone)]
pub struct ModubusConfig {
    pub slaves: Vec<ModbusSlave>,
}

#[derive(Debug, Deserialize, Clone)]
pub struct Config {
    pub gateway: GetawayCfg,
    pub modbus: ModubusConfig,
}

// 加载配置文件
pub fn load_config(path: &str) -> anyhow::Result<Config> {
    let content = fs::read_to_string(path)?;
    let cfg: Config = serde_yaml::from_str(&content)?;
    Ok(cfg)
}